package com.example.springbooteasycode.zjrc.project.Koal;


/**
 * 模拟C代码中的：str2hex方法与asc2hex方法解析
 * @author Csa
 * @time 2025/07/16
 */
public class HexConverter {
    public static void main(String[] args) {
        // 测试用例：输入字符串 "1A3F" 对应的字节数组
//        byte[] input = new byte[] { 'e', 'A', '3', 'F' };
        byte[] input = new byte[] {
                '0', '3', '0', '3', '1', '0', '1', '9', '9', '0', '9', '9', '2', '0', '5', '7',
                '9', '7', '0', '1', '0', '0', '0', '5', '3', '9', '8', '9', '1', '3', '4', '9',
                'E', '2', 'E', '2', 'C', 'E', '5', '6', '0', '0', '2', '5', '0', '0', '0', '0',
                '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '2', '0', '0', '0', '0',
                '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '5', '6', '0', '0',
                '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '5', '6', '2', '5', '0', '2',
                '2', '6', '0', '0', '8', '2', '7', '4', 'E', '7', 'F', '5', '7', 'C', '0', '0',
                '0', '0', '0', '5', '0', '3', 'A', '0', '0', '0', '0', '0', 'F', '0', 'F', '0'
        };
        byte[] output = new byte[input.length / 2];

        // 调用转换函数
        int result = str2hex(input, output);

        if (result == 0) {
            System.out.println("转换成功！");
            System.out.print("输入: ");
            for (byte b : input) {
                System.out.print((char) b);
            }
            System.out.print("\n输出: ");
            for (byte b : output) {
                System.out.printf("%02X ", b);
            }
        } else {
            System.out.println("转换失败，输入包含非法字符！");
        }
    }

    /**
     * 将ASCII字符串形式的十六进制数据转换为二进制形式
     * @param input  输入的ASCII字符串（字节数组形式）
     * @param output 输出的二进制数据（字节数组形式）
     * @return 0表示成功，-1表示失败（包含非法字符）
     */
    public static int str2hex(byte[] input, byte[] output) {
        if (input.length % 2 != 0) {
            return -1; // 输入长度必须为偶数
        }

        int outputIndex = 0;
        for (int i = 0; i < input.length; i += 2) {
            // 解析高4位
            Byte highNibble = asc2hex(input[i]);
            if (highNibble == null) return -1;

            // 解析低4位
            Byte lowNibble = asc2hex(input[i + 1]);
            if (lowNibble == null) return -1;

            // 合并为一个字节：高4位左移4位 + 低4位
            output[outputIndex++] = (byte) ((highNibble << 4) | lowNibble);
        }
        return 0;
    }

    /**
     * 将单个ASCII字符转换为对应的十六进制值
     * @param bKey 输入的ASCII字符
     * @return 对应的十六进制值（0-15），若字符非法则返回null
     */
    private static Byte asc2hex(byte bKey) {
        if (bKey >= '0' && bKey <= '9') {
            return (byte) (bKey - '0');
        } else if (bKey >= 'A' && bKey <= 'F') {
            return (byte) (bKey - 'A' + 10);
        } else if (bKey >= 'a' && bKey <= 'f') {
            return (byte) (bKey - 'a' + 10);
        } else {
            return null; // 非法字符
        }
    }
}